package cn.xie.blog.serviceuser.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.lang.UUID;
import cn.xie.blog.serviceuser.common.util.ConstantPropertiesUtil;
import cn.xie.blog.serviceuser.service.FileOSSservice;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author: xiaoxie
 * create: 2025-04-23 10:48
 * @BelongsProject: blog-parent
 * @BelongsPackage: cn.xie.blog.serviceuser.service.impl
 * description:
 */
@Service
public class FileOssServiceImpl implements FileOSSservice {
    @Override
    public String upload(MultipartFile file) {
        //使用阿里云OSS官方文档api
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ConstantPropertiesUtil.END_POINT;
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
        // 填写Bucket名称，例如examplebucket。
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        // 填写文件名。文件名包含路径，不包含Bucket名称。例如exampledir/exampleobject.txt。
        OSS ossClient = null;
        try {
            //创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            //获得上传文件的输入流
            InputStream inputStream = file.getInputStream();
            //调用oss方法实现上传ossClient.putObject里面有三个参数
            //第一个参数 buctet名称
            //二  上传oss文件路径和文件名称
            //三  文件的输入流

            //获得文件名称
            String filename = file.getOriginalFilename();
            //如果文件名字相同的话 会覆盖文件  所以使用uuid    替换字符串
            String uuid = UUID.randomUUID().toString().replace("-", "");
            filename = uuid + filename;
            //文件按照日期做分类 url中/为文件夹分级  这里使用依赖工具类
            //构建日期路径：avatar/2019-02-26/文件名.jpg
            String filePath = new DateTime().toString("yyyy-MM-dd");
            filename = filePath + "/" + filename;
            //执行上传
            ossClient.putObject(bucketName, filename, inputStream);
            //获取 拼接url地址
            String uploadUrl = "http://" + bucketName + "." + endpoint + "/" + filename;
            //返回全部路径用于存储数据库中
            return uploadUrl;
        } catch (OSSException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
        return null;

    }
}
